//
//  Listcometure.cpp
//  博客代码
//
//  Created by 马鹏朔 on 2022/11/17.
//

//#include "List.hpp"
//LTNode* ListInit()
//{
//    LTNode*guard=(LTNode*)malloc(sizeof(LTNode)); //这里就像定义一个哨兵，也就是头节点，就不用再担心头节点是不是NULL了
//    if(guard==NULL) //确保能够正常扩容
//    {
//        perror("ListNodeInit");
//    }
//    guard->next=guard; //头节点的下一个先指向自己
//    guard->prev=guard; //头节点的上一个也先指向自己
//    return guard;
//}
//LTNode*  BuyListNode(LTDataType x)
//{
//    LTNode* newnode=(LTNode*)malloc(sizeof(ListNode)); //节点申请空间
//    if(newnode==NULL)
//    {
//        perror("BuyListNode");
//    }
//    newnode->data=x;  //节点所带的值
//    newnode->prev=NULL;
//    newnode->next=NULL;
//    return newnode;
//}
//void ListNodePrint(LTNode* phead)
//{
//    assert(phead);   //保证传入的不是空指针
//    LTNode* cur =phead->next; //定一个结构体指针进行遍历打印
//    printf("guard<=>");  //这里是为了打印效果好看一点
//    while(cur!=phead)
//    {
//        printf("%d<=>",cur->data);
//        cur=cur->next;
//    }
//    printf("\n");
//}
//void ListPushBack(LTNode*phead,LTDataType x)
//{
//    assert(phead);
//    LTNode* newnode=BuyListNode(x);  //定义一个新节点
//    LTNode* tail=phead->prev;  //找到尾节点
//    tail->next=newnode;  //然后就是交换结构体里面的next prev指向的位置来实现插入。头插我已经讲述过程了，主要是大家尝试一下画画图
//    newnode->prev=tail;
//    newnode->next=phead;
//    phead->prev=newnode;
//}
//void  ListPushFront(LTNode*phead,LTDataType x)
//{
//    assert(phead);
//    LTNode* newnode=BuyListNode(x); //先定义一个节点进行头插
//    newnode->next=phead->next;  //这里要考虑顺序问题，不然很容易出错，先让定义的next指向哨兵的下一个，然后哨兵下一个的prev指向我们新的节点
//        //然后让我们我们哨兵的next指向新节点，新节点的prev指向哨兵， 这里如果不理解的可以画一下图
//       //或者我么先定义一个节点把哨兵的下一个进行保存这里就不用考虑先后顺序了，大家可以试一试
//    phead->next->prev=newnode;
//    phead->next=newnode;
//    newnode->prev=phead;
//}
//bool ListEmpty(LTNode*phead)
//{
//    assert(phead);
//    return phead->next==phead; //如果头和头的下一个指向同一个则返回真，证明只有一个哨兵
//}
//void ListPopBack(LTNode*phead)
//{
//    assert(phead);
//    assert(!ListEmpty(phead));//这里防止只剩下一个哨兵，如果只剩下一个哨兵还进行删除就强制类型报错
//    LTNode*tail=phead->prev;
//    tail->prev->next=phead;
//    phead->prev=tail->prev;
//    free(tail);
//    tail=NULL;
//}
//void ListPopFront(LTNode*phead)
//{
//    assert(phead);
//    assert(!ListEmpty(phead)); //这里防止只剩下一个哨兵，如果只剩下一个哨兵还进行删除就强制类型报错
//    LTNode*first=phead->next;  //定义一个first指向哨兵的next
//    LTNode* second=first->next; //在定义一个second指向first的next
//    phead->next=second;
//    second->prev=phead;
//    free(first);  //把first删除后进行free
//    first=NULL;  //first指针指向空，防止出现野指针
//}
//size_t ListSize(LTNode*phead)
//{
//    assert(phead);
//    LTNode*cur=phead->next;
//    size_t n=0;
//    while(cur!=phead)
//    {
//        ++n;
//        cur=cur->next;
//    }
//    return n;
//}
//LTNode* ListNodeFind(LTNode*phead,LTDataType x)  //查找后返回指针，如果找到返回找的到的结构体指针，没有找到返回空指针
//{
//    assert(phead);
//    LTNode* cur=phead->next;  //定义一个结构体指针进行遍历寻找
//    while(cur!=phead)
//    {
//        if(cur->data==x)
//        {
//            return cur;  //找到后返回的指针
//        }
//        cur=cur->next;  
//    }
//    return NULL;
//}
//void ListInsert(LTNode*pos,LTDataType x)
//{
//    assert(pos); //保证传入的pos位不是空指针
//    LTNode*prev=pos->prev; //找到pos位的前一位
//    LTNode*newnode=BuyListNode(x);  //定义一个新节点进行插入
//    pos->prev=newnode;
//    newnode->next=pos;
//    prev->next=newnode;
//    newnode->prev=prev;
//}
//void ListErase(LTNode*pos)
//{
//    LTNode*prev=pos->prev;//找到pos位的前一个
//    LTNode*next=pos->next; //找到pos的后一个
//    prev->next=next;
//    next->prev=prev;
//    free(pos);  //释放pos
//}
//void ListDestroy(LTNode*phead)
//{
//    LTNode*cur=phead->next; //定义一个结构体指针进行遍历销毁
//    while(cur!=phead)
//    {
//        LTNode*next=cur->next;
//        free(cur);
//        cur=next;
//    }
//    free(phead); //最后释放头节点
//}
